home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / benchmarks / itc / gcc / tm-news800.h < prev    next >
Encoding:
C/C++ Source or Header  |  1989-08-30  |  12.6 KB  |  359 lines

  1. /* Definitions of target machine for GNU compiler.  SONY NEWS version.
  2.    Copyright (C) 1987 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY.  No author or distributor
  8. accepts responsibility to anyone for the consequences of using it
  9. or for whether it serves any particular purpose or works at all,
  10. unless he says so in writing.  Refer to the GNU CC General Public
  11. License for full details.
  12.  
  13. Everyone is granted permission to copy, modify and redistribute
  14. GNU CC, but only under the conditions described in the
  15. GNU CC General Public License.   A copy of this license is
  16. supposed to have been given to you along with GNU CC so you
  17. can know your rights and responsibilities.  It should be in a
  18. file named COPYING.  Among other things, the copyright notice
  19. and this notice must be preserved on all copies.  */
  20.  
  21. /* Use the GNU Assembler, because the system's assembler
  22.    has no way to assemble the difference of two labels
  23.    for the displacement in a switch-dispatch instruction.  */
  24.  
  25. #define USE_GAS
  26.  
  27. #ifndef USE_GAS
  28. /* This controls conditionals in tm-m68k.h.  */
  29. #define MOTOROLA
  30. #endif
  31.  
  32. #include "tm-m68k.h"
  33.  
  34. /* See tm-m68k.h.  7 means 68020 with 68881.  */
  35.  
  36. #define TARGET_DEFAULT 7
  37.  
  38. /* Define __HAVE_FPU__ in preprocessor, unless -msoft-float is specified.
  39.    This will control the use of inline 68881 insns in certain macros.  */
  40.  
  41. #define CPP_SPEC "%{!msoft-float:-D__HAVE_FPU__}"
  42.  
  43. /* Names to predefine in the preprocessor for this target machine.  */
  44.  
  45. #define CPP_PREDEFINES "-Dunix -Dmc68020 -Dnews800 -Dsony -Dsony_news"
  46.  
  47. /* This is BSD, so it wants DBX format.  */
  48.  
  49. #define DBX_DEBUGGING_INFO
  50.  
  51. /* Override parts of tm-m68k.h to fit Sony's assembler syntax.  */
  52.  
  53. #undef POINTER_BOUNDARY
  54. #undef BIGGEST_ALIGNMENT
  55. #undef CALL_USED_REGISTERS
  56. #undef FUNCTION_VALUE
  57. #undef LIBCALL_VALUE
  58. #undef FUNCTION_PROFILER
  59.  
  60. #ifdef MOTOROLA
  61. #undef FUNCTION_PROLOGUE
  62. #undef FUNCTION_EPILOGUE
  63. #undef REGISTER_NAMES
  64. #undef ASM_OUTPUT_DOUBLE
  65. #undef ASM_OUTPUT_SKIP
  66. #undef PRINT_OPERAND
  67. #undef PRINT_OPERAND_ADDRESS
  68. #endif  
  69.  
  70. #undef ASM_OUTPUT_ALIGN
  71.  
  72. /* Allocation boundary (in *bits*) for storing pointers in memory.  */
  73. #define POINTER_BOUNDARY 32
  74.  
  75. /* There is no point aligning anything to a rounder boundary than this.  */
  76. #define BIGGEST_ALIGNMENT 32
  77.  
  78. /* A bitfield declared as `int' forces `int' alignment for the struct.  */
  79. #define PCC_BITFIELD_TYPE_MATTERS
  80.   
  81. /* NEWS makes d2, d3, fp2 and fp3 unsaved registers, unlike the Sun system.  */
  82.   
  83. #define CALL_USED_REGISTERS \
  84.  {1, 1, 1, 1, 0, 0, 0, 0, \
  85.   1, 1, 0, 0, 0, 0, 0, 1, \
  86.   1, 1, 1, 1, 0, 0, 0, 0}
  87.  
  88. /* NEWS returns floats and doubles in fp0, not d0/d1.  */
  89.  
  90. #define FUNCTION_VALUE(VALTYPE,FUNC) LIBCALL_VALUE (TYPE_MODE (VALTYPE))
  91.  
  92. #define LIBCALL_VALUE(MODE) \
  93.  gen_rtx (REG, (MODE), ((TARGET_68881 && ((MODE) == SFmode || (MODE) == DFmode)) ? 16 : 0))
  94.  
  95. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  96.   fprintf (FILE, "\t.align %d\n", (LOG))
  97.  
  98. #ifdef MOTOROLA
  99.  
  100. #define FUNCTION_PROLOGUE(FILE, SIZE)     \
  101. { register int regno;                        \
  102.   register int mask = 0;                    \
  103.   static char *reg_names[] = REGISTER_NAMES;            \
  104.   extern char call_used_regs[];                    \
  105.   int fsize = (SIZE);                        \
  106.   if (frame_pointer_needed)                    \
  107.     { if (TARGET_68020 || fsize < 0x10000)            \
  108.         fprintf (FILE, "\tlink fp,#%d\n", -fsize);        \
  109.       else                            \
  110.     fprintf (FILE, "\tlink fp,#0\n\tsub.l #%d,sp\n", fsize); }  \
  111.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  112.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  113.        mask |= 1 << (regno - 16);                \
  114.   if (mask != 0)                        \
  115.     fprintf (FILE, "\tfmovem.x #0x%x,-(sp)\n", mask & 0xff);    \
  116.   mask = 0;                            \
  117.   for (regno = 0; regno < 16; regno++)                \
  118.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  119.        mask |= 1 << (15 - regno);                \
  120.   if (frame_pointer_needed)                    \
  121.     mask &= ~ (1 << (15-FRAME_POINTER_REGNUM));            \
  122.   if (exact_log2 (mask) >= 0)                    \
  123.     fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[15 - exact_log2 (mask)]);  \
  124.   else if (mask) fprintf (FILE, "\tmovem.l #0x%x,-(sp)\n", mask); }
  125.  
  126. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  127.    fprintf (FILE, "\tmove.l #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  128.  
  129. #define FUNCTION_EPILOGUE(FILE, SIZE) \
  130. { register int regno;                        \
  131.   register int mask, fmask;                    \
  132.   register int nregs;                        \
  133.   int offset, foffset;                        \
  134.   extern char call_used_regs[];                    \
  135.   static char *reg_names[] = REGISTER_NAMES;            \
  136.   extern int current_function_pops_args;            \
  137.   extern int current_function_args_size;            \
  138.   int fsize = (SIZE);                        \
  139.   int big = 0;                            \
  140.   nregs = 0;  fmask = 0;                    \
  141.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  142.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  143.       { nregs++; fmask |= 1 << (23 - regno); }            \
  144.   foffset = nregs * 12;                        \
  145.   nregs = 0;  mask = 0;                        \
  146.   if (frame_pointer_needed) regs_ever_live[FRAME_POINTER_REGNUM] = 0; \
  147.   for (regno = 0; regno < 16; regno++)                \
  148.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  149.       { nregs++; mask |= 1 << regno; }                \
  150.   offset = foffset + nregs * 4;                    \
  151.   if (offset + fsize >= 0x8000 && frame_pointer_needed)        \
  152.     { fprintf (FILE, "\tmove.l #%d,a0\n", -fsize);        \
  153.       fsize = 0, big = 1; }                    \
  154.   if (exact_log2 (mask) >= 0) {                    \
  155.     if (big)                            \
  156.       fprintf (FILE, "\tmove.l (-%d,fp,a0.l),%s\n",        \
  157.            offset + fsize, reg_names[exact_log2 (mask)]);    \
  158.     else if (! frame_pointer_needed)                \
  159.       fprintf (FILE, "\tmove.l (sp)+,%s\n",            \
  160.            reg_names[exact_log2 (mask)]);            \
  161.     else                            \
  162.       fprintf (FILE, "\tmove.l (-%d,fp),%s\n",            \
  163.            offset + fsize, reg_names[exact_log2 (mask)]); }    \
  164.   else if (mask) {                        \
  165.     if (big)                            \
  166.       fprintf (FILE, "\tmovem.l (-%d,fp,a0.l),#0x%x\n",        \
  167.            offset + fsize, mask);                \
  168.     else if (! frame_pointer_needed)                \
  169.       fprintf (FILE, "\tmovem.l (sp)+,#0x%x\n", mask);        \
  170.     else                            \
  171.       fprintf (FILE, "\tmovem.l (-%d,fp),#0x%x\n",        \
  172.            offset + fsize, mask); }                \
  173.   if (fmask) {                            \
  174.     if (big)                            \
  175.       fprintf (FILE, "\tfmovem.x (-%d,fp,a0.l),#0x%x\n",    \
  176.            foffset + fsize, fmask);                \
  177.     else if (! frame_pointer_needed)                \
  178.       fprintf (FILE, "\tfmovem.x (sp)+,#0x%x\n", fmask);    \
  179.     else                            \
  180.       fprintf (FILE, "\tfmovem.x (-%d,fp),#0x%x\n",        \
  181.            foffset + fsize, fmask); }            \
  182.   if (frame_pointer_needed)                    \
  183.     fprintf (FILE, "\tunlk fp\n");                \
  184.   if (current_function_pops_args && current_function_args_size)    \
  185.     fprintf (FILE, "\trtd #%d\n", current_function_args_size);    \
  186.   else fprintf (FILE, "\trts\n"); }
  187.  
  188. /* Difference from tm-m68k.h is in `fp' instead of `a6'.  */
  189.  
  190. #define REGISTER_NAMES \
  191. {"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",    \
  192.  "a0", "a1", "a2", "a3", "a4", "a5", "fp", "sp",    \
  193.  "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7"}
  194.   
  195. #define ASM_OUTPUT_DOUBLE(FILE,VALUE)  \
  196.   fprintf (FILE, "\t.double 0d%.20e\n", (VALUE))
  197.  
  198. #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
  199.   fprintf (FILE, "\t.space %d\n", (SIZE))
  200.  
  201. #define PRINT_OPERAND(FILE, X, CODE)  \
  202. { if (CODE == '.') fprintf (FILE, ".");                    \
  203.   else if (CODE == '#') fprintf (FILE, "#");                \
  204.   else if (CODE == '-') fprintf (FILE, "-(sp)");            \
  205.   else if (CODE == '+') fprintf (FILE, "(sp)+");            \
  206.   else if (CODE == 's') fprintf (FILE, "(sp)");                \
  207.   else if (CODE == '!') fprintf (FILE, "ccr");                \
  208.   else if (GET_CODE (X) == REG)                        \
  209.     fprintf (FILE, "%s", reg_name [REGNO (X)]);                \
  210.   else if (GET_CODE (X) == MEM)                        \
  211.     output_address (XEXP (X, 0));                    \
  212.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode)    \
  213.     { union { double d; int i[2]; } u;                    \
  214.       union { float f; int i; } u1;                    \
  215.       u.i[0] = XINT (X, 0); u.i[1] = XINT (X, 1);            \
  216.       u1.f = u.d;                            \
  217.       if (CODE == 'f')                            \
  218.         fprintf (FILE, "#0f%.9e", u1.f);                \
  219.       else                                \
  220.         fprintf (FILE, "#0x%x", u1.i); }                \
  221.   else if (GET_CODE (X) == CONST_DOUBLE)                \
  222.     { union { double d; int i[2]; } u;                    \
  223.       u.i[0] = XINT (X, 0); u.i[1] = XINT (X, 1);            \
  224.       fprintf (FILE, "#0d%.20e", u.d); }                \
  225.   else if (CODE == 'b') output_addr_const (FILE, X);            \
  226.   else { putc ('#', FILE); output_addr_const (FILE, X); }}
  227.  
  228. #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \
  229. { register rtx reg1, reg2, breg, ireg;                    \
  230.   register rtx addr = ADDR;                        \
  231.   rtx offset;                                \
  232.   switch (GET_CODE (addr))                        \
  233.     {                                    \
  234.     case REG:                                \
  235.       fprintf (FILE, "(%s)", reg_name [REGNO (addr)]);            \
  236.       break;                                \
  237.     case PRE_DEC:                            \
  238.       fprintf (FILE, "-(%s)", reg_name [REGNO (XEXP (addr, 0))]);    \
  239.       break;                                \
  240.     case POST_INC:                            \
  241.       fprintf (FILE, "(%s)+", reg_name [REGNO (XEXP (addr, 0))]);    \
  242.       break;                                \
  243.     case PLUS:                                \
  244.       reg1 = 0;    reg2 = 0;                        \
  245.       ireg = 0;    breg = 0;                        \
  246.       offset = 0;                            \
  247.       if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))                \
  248.     {                                \
  249.       offset = XEXP (addr, 0);                    \
  250.       addr = XEXP (addr, 1);                    \
  251.     }                                \
  252.       else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))            \
  253.     {                                \
  254.       offset = XEXP (addr, 1);                    \
  255.       addr = XEXP (addr, 0);                    \
  256.     }                                \
  257.       if (GET_CODE (addr) != PLUS) ;                    \
  258.       else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND)        \
  259.     {                                \
  260.       reg1 = XEXP (addr, 0);                    \
  261.       addr = XEXP (addr, 1);                    \
  262.     }                                \
  263.       else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND)        \
  264.     {                                \
  265.       reg1 = XEXP (addr, 1);                    \
  266.       addr = XEXP (addr, 0);                    \
  267.     }                                \
  268.       else if (GET_CODE (XEXP (addr, 0)) == MULT)            \
  269.     {                                \
  270.       reg1 = XEXP (addr, 0);                    \
  271.       addr = XEXP (addr, 1);                    \
  272.     }                                \
  273.       else if (GET_CODE (XEXP (addr, 1)) == MULT)            \
  274.     {                                \
  275.       reg1 = XEXP (addr, 1);                    \
  276.       addr = XEXP (addr, 0);                    \
  277.     }                                \
  278.       else if (GET_CODE (XEXP (addr, 0)) == REG)            \
  279.     {                                \
  280.       reg1 = XEXP (addr, 0);                    \
  281.       addr = XEXP (addr, 1);                    \
  282.     }                                \
  283.       else if (GET_CODE (XEXP (addr, 1)) == REG)            \
  284.     {                                \
  285.       reg1 = XEXP (addr, 1);                    \
  286.       addr = XEXP (addr, 0);                    \
  287.     }                                \
  288.       if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT        \
  289.       || GET_CODE (addr) == SIGN_EXTEND)                \
  290.     { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; }    \
  291.       if (offset != 0) { if (addr != 0) abort (); addr = offset; }    \
  292.       if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND            \
  293.             || GET_CODE (reg1) == MULT))            \
  294.       || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))        \
  295.     { breg = reg2; ireg = reg1; }                    \
  296.       else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))        \
  297.     { breg = reg1; ireg = reg2; }                    \
  298.       if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF)    \
  299.         { int scale = 1;                        \
  300.       if (GET_CODE (ireg) == MULT)                    \
  301.         { scale = INTVAL (XEXP (ireg, 1));                \
  302.           ireg = XEXP (ireg, 0); }                    \
  303.       if (GET_CODE (ireg) == SIGN_EXTEND)                \
  304.         fprintf (FILE, "(L%d-LI%d.b,pc,%s.w",            \
  305.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  306.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  307.              reg_name[REGNO (XEXP (ireg, 0))]);         \
  308.       else                                \
  309.         fprintf (FILE, "(L%d-LI%d.b,pc,%s.l",            \
  310.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  311.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  312.              reg_name[REGNO (ireg)]);                \
  313.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  314.       putc (')', FILE);                        \
  315.       break; }                            \
  316.       if (ireg != 0 || breg != 0)                    \
  317.     { int scale = 1;                        \
  318.       if (breg == 0)                        \
  319.         abort ();                            \
  320.       fprintf (FILE, "(");                        \
  321.       if (addr != 0) {                        \
  322.         output_addr_const (FILE, addr);                \
  323.         putc (',', FILE); }                        \
  324.       fprintf (FILE, "%s", reg_name[REGNO (breg)]);            \
  325.       if (ireg != 0)                        \
  326.         putc (',', FILE);                        \
  327.       if (ireg != 0 && GET_CODE (ireg) == MULT)            \
  328.         { scale = INTVAL (XEXP (ireg, 1));                \
  329.           ireg = XEXP (ireg, 0); }                    \
  330.       if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND)        \
  331.         fprintf (FILE, "%s.w", reg_name[REGNO (XEXP (ireg, 0))]);    \
  332.       else if (ireg != 0)                        \
  333.         fprintf (FILE, "%s.l", reg_name[REGNO (ireg)]);        \
  334.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  335.       putc (')', FILE);                        \
  336.       break;                            \
  337.     }                                \
  338.       else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF)        \
  339.     { fprintf (FILE, "(L%d-LI%d.b,pc,%s:l)",            \
  340.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  341.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  342.            reg_name[REGNO (reg1)]);                \
  343.       break; }                            \
  344.     default:                                \
  345.       if (GET_CODE (addr) == CONST_INT                    \
  346.       && INTVAL (addr) < 0x8000                    \
  347.       && INTVAL (addr) >= -0x8000)                    \
  348.     fprintf (FILE, "%d.w", INTVAL (addr));                \
  349.       else                                \
  350.         output_addr_const (FILE, addr);                    \
  351.     }}
  352.  
  353. #else /* Using GAS, which uses the MIT assembler syntax, like a Sun.  */
  354.  
  355. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  356.    fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  357.  
  358. #endif /* MOTOROLA */
  359.